home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / math / gle-3.000 / gle-3 / gle / util / manip / filemenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-07  |  20.1 KB  |  674 lines

  1. #include "all.h"
  2. #include "color.h"
  3. #include "edt.h"
  4.  
  5. #ifdef __TURBOC__
  6. #define DASHCHAR 249
  7. #include "bios.h"
  8. #include "conio.h"
  9. #include "dir.h"
  10. #elif DJ                /* a.r. */
  11. #include <gppconio.h>
  12. #include <dir.h>
  13. #define clrscr ScreenClear
  14. #define DASHCHAR 249
  15. #elif EMXOS2            /* a.r. */
  16. #define INCL_DOS
  17. #include <os2.h>
  18. #include <conio.h>
  19. #include <sys/types.h>
  20. #include <sys/dir.h>
  21. #define DASHCHAR 249
  22. #define WHITE 15
  23. #define BLACK 0
  24. #else
  25. #define DASHCHAR '.'
  26. #include "vaxconio.h"
  27. #endif
  28.  
  29.  
  30. #define true (!false)
  31. #define false 0
  32. #define BEGINDEF extern
  33. /* #include "begin.h" */
  34. #define BCOLOR BLUE
  35. #define FCOLOR MAGENTA
  36. #define HBCOLOR h_bcolor
  37. #define HVCOLOR h_fcolor
  38. #define VCOLOR WHITE
  39.  
  40. int h_bcolor;
  41. int h_fcolor;
  42. int getsize(void);
  43. char *tabtospace(char *s);
  44. int printdash(int i);
  45. char *gledir(char *s);
  46. int scr_menuval(void);
  47. int scr_menubg(void);
  48. int scr_menuhi(void);
  49. int scr_grey(void);
  50. int gle_redraw(void);
  51. int text_showerror(void);
  52. int text_save(void);
  53. char *strfile(char *s);
  54.  
  55. int vdelete(int i);
  56. int vinsert(int y, char *s);
  57. int m_ifsend(char *s);
  58. int m_sendline(void);
  59. int minit_extras(void);
  60. int minit_extras(void);
  61. int initmenu(void);
  62. int mystrlen(char *s);
  63. int pick_file(char *d, char *w);
  64. int ncpy(char *d, char *s, int n);
  65. int setvstr(char **d, char *s);
  66. int text_inkey(void);
  67.  
  68. struct menu_struct { int x; int y; char *title; int width; int typ; int typ2;
  69.         char *val; char *help; };
  70. typedef struct menu_struct menutype;
  71. struct pmenu_struct {int ci; menutype *menu; };
  72. typedef struct pmenu_struct pmenutype;
  73. pmenutype pmenu[17];
  74. int setmenu(menutype *m,int x, int y, int typ, int typ2, int width, char *title
  75.         , char *val, char *help);
  76. int do_menu(pmenutype *p);
  77. int token_space(void);
  78. int extractmenu(void);
  79. int add_unrecognized(char *s);
  80. int fillinmenu(int nbegin);
  81. int nunrec;
  82.  
  83. #define  PTXT 0
  84. enum {MEND,MTEXT,MFILE,MTOGON,MTOGOFF,MSUB,MRETURN,MNULL};
  85. enum {SNORM,SROL,SNEXTS,SNEXT,SSTR,STOG,SS,SSIZE,SNOBOX,SAMOVE,SSOFF,SSNULL};
  86. int refresh_menu(struct menu_struct *m);
  87. int menu_hilight(struct menu_struct *m);
  88. int menu_norm(struct menu_struct *m);
  89.  
  90. /* menu's
  91.         topmenu
  92.                 title,xtitle,ytitle min max dist on off, ticks dticks
  93.                 (2) let d = exp
  94.                 Data files
  95.                 Dn marker ,color, lwidth, lstyle, err,
  96.         xnamesmenu
  97.         ynamesmenu
  98.         fillmenu
  99.         barmenu
  100.         axismenu's
  101. */
  102. read_default(char *result, char *ques, char *dflt)
  103. {
  104.         char s[200];
  105.         int r;
  106.         strcpy(s,ques); strcat(s," ["); strcat(s,dflt); strcat(s,"] ");
  107. /*        r = read_input(result,s);*/
  108.         if (strlen(result)==0) strcpy(result,dflt);
  109.         return r;
  110. }
  111. extern int changed;
  112. addline(char *s)
  113. {
  114.         changed = true;
  115. }
  116. char *mark_names[] = {
  117.         "dot", "square", "fcircle", "club", "diamond", "triangle", "snake"
  118.         ,"otimes", "odot", ""};
  119.  
  120. int init_menucolor(void);
  121. int m_gstart,m_gend;
  122. /*
  123.  
  124.         Getkey/command
  125.                 arrowkeys normal
  126.                 left and right arrow if editing
  127.                 delete
  128.                 insert normal character
  129.                 enter, change to new menu
  130.                 escape exit.
  131.                 F1, help key
  132. */
  133. char mbuff[255];
  134.  
  135. extern int iserr;
  136. int hcx,cx,hcy;        /* HIlighted current x,y */
  137. do_menu(pmenutype *ppmenu)
  138. {
  139.         menutype *cm,*cmi,*si=NULL,*mi;
  140.         int citem,emode=false;
  141.         int c;
  142.         cm = ppmenu->menu;
  143.         citem = ppmenu->ci;
  144.         cmi = cm+citem;
  145.         refresh_menu(cm);
  146.         menu_hilight(cmi);
  147.         for (;;) {
  148.          c = text_inkey();
  149.          if (iserr) {fner_clear(); window(1,1,80,24);}
  150.          switch (c) {
  151.            case eescape: /* ESCAPE */
  152.            case equit: /* control c */
  153.                 return true;
  154.            case eleft: /* left */
  155.                 if (emode) {
  156.                         if (cx>0) cx--;
  157.                         gotoxy(hcx+cx,hcy);
  158.                 } else {
  159.                         for (si=NULL,mi=cm;mi->typ!=0;mi++) {
  160.                                 if (mi->y==cmi->y && mi->x < cmi->x)
  161.                                 if (si!=NULL) {
  162.                                         if (mi->x > si->x)
  163.                                                 si = mi;
  164.                                 } else si = mi;
  165.                         }
  166.                 }
  167.                 break;
  168.            case eright: /* right */
  169.                 if (emode) {
  170.                         if (cx < strlen(cmi->val)) cx++;
  171.                         gotoxy(hcx+cx,hcy);
  172.                 } else {
  173.                         for (si=NULL,mi=cm;mi->typ!=0;mi++) {
  174.                                 if (mi->y==cmi->y && mi->x > cmi->x)
  175.                                 if (si!=NULL) {
  176.                                         if (mi->x < si->x)
  177.                                                 si = mi;
  178.                                 } else si = mi;
  179.  
  180.                         }
  181.                 }
  182.                 break;
  183.            case eup: /* arrow up */
  184.                 emode = false;
  185.                 for (si=NULL,mi=cm;mi->typ!=0;mi++) {
  186.                         if (mi->typ<MNULL) {
  187.                          if (si!=NULL) if (mi->y==si->y)
  188.                            if (abs(mi->x - cmi->x) <  abs(si->x - cmi->x))
  189.                                 si = mi;
  190.                          if (mi->y < cmi->y) if (si!=NULL) {
  191.                            if (mi->y > si->y) si = mi;
  192.                          } else          si = mi;
  193.                         }
  194.                 }
  195.                 break;
  196.            case edown: /* arrow down */
  197.                 emode = false;
  198.                 for (si=NULL,mi=cm;mi->typ!=0;mi++) {
  199.                         if (mi->typ<MNULL) {
  200.                          if (si!=NULL) if (mi->y==si->y)
  201.                            if (abs(mi->x - cmi->x) <  abs(si->x - cmi->x))
  202.                                 si = mi;
  203.                          if (mi->y > cmi->y) if (si!=NULL) {
  204.                            if (mi->y < si->y) si = mi;
  205.                          } else  si = mi;
  206.                         }
  207.                 }
  208.                 break;
  209.           case ehelp: /* f1 help */
  210.                 do_help(cmi->help);
  211.                 refresh_menu(cm);
  212.                 menu_hilight(cmi);
  213.                 break;
  214.           case ereturn: /* carriage return */
  215.                 if (emode==true && cmi->typ==MFILE) {
  216.                         emode = false;
  217.                         break;
  218.                 }
  219.                 emode = false;
  220. doreturn:;
  221.                 switch (cmi->typ) {
  222.                   case MTEXT:
  223. /*                        if (emode) emode = false; else emode = true; */
  224.                         break;
  225.                   case MTOGON:
  226.                         cmi->typ = MTOGOFF;
  227.                         menu_hilight(cmi);
  228.                         break;
  229.                   case MTOGOFF:
  230.                         cmi->typ = MTOGON;
  231.                         menu_hilight(cmi);
  232.                         break;
  233.                   case MRETURN:
  234.                         goto exit_menu;
  235.                   case MFILE:
  236.                         if (mystrlen(cmi->val)==0) cmi->val = calloc(20,1);
  237.                         pick_file(cmi->val,"*.dat");
  238.                         refresh_menu(cm);
  239.                         menu_hilight(cmi);
  240.                         break;
  241.                   case MSUB: /* SUB MENU */
  242.                         if (cmi->typ2>99) do_menu(&pmenu[cmi->typ2 - 100]);
  243.                         refresh_menu(cm);
  244.                         menu_hilight(cmi);
  245.                 }
  246.  
  247.                 for (si=NULL,mi=cm;mi->typ!=0;mi++) {
  248.                         if (mi->y==cmi->y && mi->x > cmi->x)
  249.                         if (si!=NULL) {
  250.                                 if (mi->x < si->x)
  251.                                         si = mi;
  252.                         } else si = mi;
  253.                 }
  254.  
  255.                 break;
  256.           case edelete: /* delete */
  257.                 emode = true;
  258.                 if (cmi->val==NULL) break;
  259.                 if (strlen(cmi->val)==0) break;
  260.                 if (cx<1) break;
  261.                 ncpy(mbuff,cmi->val,cx-1);
  262.                 strcat(mbuff,cmi->val + cx);
  263.                 setvstr(&cmi->val,mbuff);
  264.                 cx--;
  265.                 gotoxy(hcx+cx,hcy);
  266.                 cputs(cmi->val + cx);
  267.                 putch(DASHCHAR);
  268.                 gotoxy(hcx+cx,hcy);
  269.                 break;
  270.           case edrawit:
  271.                 break;
  272.           case eshowerror:
  273.                 break;
  274.           case esave: /* save file */
  275.                 break;
  276.           default: /* normal key */
  277.                 if (c<26  && c!=9) {fner("Key has no affect"); break;}
  278.                 if (c>200)  fner("Unimplemented command");
  279.                 else {
  280. /*         if (cmi->typ!=MTEXT  && cmi->typ!=MFILE) goto doreturn; */
  281.                         emode = true;
  282.                         if (cmi->val==NULL) setvstr(&cmi->val,"");
  283.                         ncpy(mbuff,cmi->val,cx);
  284.                         mbuff[cx] = c; mbuff[cx+1] = 0;
  285.                         strcat(mbuff,cmi->val + cx);
  286.                         setvstr(&cmi->val,mbuff);
  287.                         gotoxy(hcx+cx,hcy);
  288.                         cputs(cmi->val + cx);
  289.                         cx++;
  290.                         gotoxy(hcx+cx,hcy);
  291.                 }
  292.                 break;
  293.          }
  294.          if (si!=NULL) {
  295.                 menu_norm(cmi);
  296.                 cmi = si;
  297.                 menu_hilight(cmi);
  298.                 si = NULL;
  299.          }
  300.         }
  301. exit_menu:;
  302.         /* save current point */
  303.         { int i;
  304.                 for (i=0,mi=cm;mi->typ!=0;mi++,i++) {
  305.                   if (mi==cmi) ppmenu->ci = i;
  306.                 }
  307.         }
  308.         return false; /* normal exit */
  309. }
  310. setvstr(char **d, char *s)
  311. {
  312.         if ((*d) != 0) myfree(*d);
  313.         *d = sdup(s);
  314. }
  315. int mystrlen(char *s)
  316. {
  317.         if (s==NULL) return 0;
  318.         else return strlen(s);
  319. }
  320. menu_hilight(struct menu_struct *mm)
  321. {
  322.         int i,j;
  323.         struct menu_struct *m=mm;
  324.         scr_menuhi();
  325.         hcx = m->x + mystrlen(m->title);
  326.         hcy = m->y;
  327.         gotoxy(hcx,hcy);
  328.         if (m->typ==MTOGON || m->typ==MTOGOFF) {
  329.                 if (m->val==NULL) m->val = malloc(4);
  330.                 if (m->typ==MTOGON) strcpy(m->val,"ON ");
  331.                 if (m->typ==MTOGOFF) strcpy(m->val,"OFF");
  332.         }
  333.         if (m->val==NULL) setvstr(&m->val,"");
  334.         cputs(m->val);
  335.         j = m->width - mystrlen(m->val);
  336.         printdash(j);
  337.         cx = mystrlen(m->val);
  338.         gotoxy(hcx+cx,hcy);
  339. }
  340. printdash(int j)
  341. {
  342.         int i;
  343.         for (i=0;i<j;i++) mbuff[i] = DASHCHAR;
  344.         mbuff[j] = 0;
  345.         if (j>0) cputs(mbuff);
  346. }
  347. menu_norm(struct menu_struct *mm)
  348. {
  349.         int i,j;
  350.         struct menu_struct *m=mm;
  351.         gotoxy(m->x + mystrlen(m->title),m->y);
  352.         if (m->typ==MTOGON  || m->typ==MTOGOFF) {
  353.                 if (m->val==NULL) m->val = malloc(4);
  354.                 if (m->typ==MTOGON) strcpy(m->val,"ON ");
  355.                 if (m->typ==MTOGOFF) strcpy(m->val,"OFF");
  356.         }
  357.         if (m->val != NULL) {
  358.                 scr_menuval();
  359.                 if (m->width>0) cputs(m->val);
  360.                 scr_menubg();
  361.         }
  362.         j = m->width - mystrlen(m->val);
  363.         printdash(j);
  364. }
  365. refresh_menu(struct menu_struct *mm)
  366. {
  367.         int i;
  368.         struct menu_struct *m=mm;
  369.         window(1,1,80,24);
  370.         scr_menubg();
  371.         clrscr();
  372.         for (;m->typ!=0;m++) {
  373.                 if (m->title != NULL) if (strlen(m->title)>0) {
  374.                         gotoxy(m->x,m->y);
  375.                         cputs(m->title);
  376.                 }
  377.                 menu_norm(m);
  378.         }
  379. }
  380. do_help(char *k1, char *k2)
  381. {
  382.         FILE *hfile;
  383.         int i,yy;
  384.         char hbuff[90];
  385.         char *hfilename="manip.hlp";
  386.         char fk1[20],fk2[20],*os,*si;
  387.         scr_menuval();
  388.         clrscr();
  389.         if (strcmp(k2," ")==0) k2 = "";
  390.         gotoxy(1,1); wprintf("Manip help on topic {%s},  sub topic {%s}",k1,k2);
  391.         scr_menubg();
  392.         hfile = fopen(gledir(hfilename),"r");
  393.         if (hfile==NULL) wprintf("Unable to open {%s} \n",gledir(hfilename));
  394.         for (;!feof(hfile);) {
  395.                 if (fgets(hbuff,90,hfile)!=NULL) {
  396.                         if (hbuff[0]=='3') {
  397.                                 strtok(hbuff," \n");
  398.                                 strcpy(fk1,strtok(NULL," \n"));
  399.                                 if (strcmp(fk1,k1)==0 && strlen(k2)==0)
  400.                                         goto help_type;
  401.                         }
  402.                         if (hbuff[0]=='4') {
  403.                                 strtok(hbuff," \n");
  404.                                 strcpy(fk2,strtok(NULL," \n"));
  405.                                 if (strlen(k2)>0)
  406.                                 if (strcmp(fk1,k1)==0 &&
  407.                                         strcmp(fk2,k2)==0) goto help_type;
  408.                         }
  409.                 }
  410.         }
  411.         fclose(hfile);
  412.         scr_menuval();
  413.         gotoxy(1,9);
  414.         wprintf("help text not found sorry ??? \n");
  415.         text_inkey();
  416.         return;
  417. help_type:;
  418.         yy = 3;
  419.         for (;!feof(hfile);) {
  420.                 if (fgets(hbuff,90,hfile)!=NULL) {
  421.                         if (isdigit(hbuff[0])) {
  422.                                 goto end_help;
  423.                         }
  424.                         gotoxy(1,yy++); cputs(tabtospace(hbuff));
  425.                 }
  426.                 if (yy==22) {
  427.                         scr_menuval();
  428.                         gotoxy(2,24); wprintf("Press any key for next screen of help");
  429.                         text_inkey();  clrscr();
  430.                         gotoxy(1,1); wprintf("Graph help on topic {%s},  sub topic {%s}",k1,k2);
  431.                         scr_menubg();  yy = 3;
  432.                 }
  433.         }
  434. end_help:;
  435.         scr_menuval();
  436.         gotoxy(1,yy+1); wprintf("Press any key to continue");
  437.         text_inkey();
  438.         fclose(hfile);
  439. }
  440. add_unrecognized(char *s)
  441. {
  442.         if (nunrec>6) return;
  443. }
  444. int vunquote(char **s);
  445. vunquote(char **ss)
  446. {
  447.         char *s = *ss;
  448.         if (*s=='\"') {
  449.                 s[strlen(s)-1] = 0;
  450.                 *ss = sdup(s+1);
  451.                 myfree(s);
  452.         }
  453. }
  454.  
  455. int initmenudone;
  456. menutype *m_pnt[20];
  457. menutype *m_end[20];
  458. char *m_val[20];
  459. char m_tog[50];
  460. initmenu()
  461. {
  462.         menutype *mi;
  463.         char *s,kw1[80],kw2[80];
  464.         int i,j,nt=0,k,z,ct,used;
  465.         static int nv;
  466.  
  467.         if (!initmenudone) {
  468.           initmenudone = true;
  469.           for (z=0;z<=10;z++) {
  470.             for (mi=pmenu[z].menu; mi->typ!=0; mi++) {
  471.                 if (mi->typ==MTOGON || mi->typ==MTOGOFF) {
  472.                         m_tog[nt++] = mi->typ;
  473.                 }
  474.                 if (mi->val!=NULL) {
  475.                         m_val[nv] = sdup(mi->val);
  476.                         mi->val = sdup(mi->val);
  477.                         m_pnt[nv++] = mi;
  478.                 }
  479.             }
  480.           }
  481.         } else {
  482.           for (z=0;z<=10;z++) {
  483.             for (mi=pmenu[z].menu; mi->typ!=0; mi++) {
  484.                 if (mi->typ==MTOGON || mi->typ==MTOGOFF) {
  485.                         mi->typ = m_tog[nt++];
  486.                 } else {
  487.                         if (mi->val!=0) {
  488.                                 myfree(mi->val);
  489.                         }
  490.                         mi->val = 0;
  491.                 }
  492.             }
  493.           }
  494.           for (z=0;z<nv;z++) {
  495.                 mi = m_pnt[z];
  496.                 mi->val = sdup(m_val[z]);
  497.           }
  498.         }
  499. }
  500.  
  501. char msend[200];
  502. #define mss msend+strlen(msend)
  503. char cs[80]="xyz";
  504. int gstartend;
  505. /* char msend[200]; */
  506. m_sendline()
  507. {
  508.         msend[0] = 0;
  509.         strcpy(cs,"xyz");
  510. }
  511. m_ifsend(char *s)
  512. {
  513.         if (strcmp(s,cs)!=0) {
  514.           m_sendline();
  515.           sprintf(msend,"\t%s ",s);
  516.           strcpy(cs,s);
  517.         }
  518. }
  519. int g_get_usersize(double *x, double *y);
  520. setmenu(menutype *m,int x, int y, int typ, int typ2, int width, char *title
  521. , char *val, char *help)
  522. {
  523.         m->x = x; m->y = y; m->typ = typ; m->typ2 = typ2; m->width = width;
  524.         m->title = sdup(title);
  525.         if (val!=0) m->val = sdup(val);
  526.         m->help = sdup(help);
  527. }
  528. init_menucolor()
  529. {
  530.                 h_bcolor = WHITE; h_fcolor = BLACK;
  531. }
  532. int pick_file(char *result, char *wld)
  533. {
  534.         pmenutype ask;
  535.         char wild[80];
  536.         char buff2[80];
  537.         char *f[80];
  538.         char *swap;
  539.         menutype *m,*mi,*mwild;
  540. #ifndef EMXOS2                          /* a.r. */
  541.         struct ffblk ffblk;
  542. #else
  543.         HDIR            hdir = HDIR_SYSTEM;
  544.         FILEFINDBUF3    FFbufr;
  545.         unsigned long   SearchCnt = 1;
  546. #endif
  547.         int done,i,x,y,nf,rval,adddir=false;
  548.  
  549.         strcpy(wild,wld);
  550.         ask.ci = 0;
  551. pick_again:;
  552.         x=0; y=0; nf=0;
  553.         init_menucolor();
  554. #ifndef EMXOS2                          /* a.r. */
  555.         done = findfirst(wild,&ffblk,0);
  556.         for (nf=0;nf<70 && !done;nf++) {
  557.                 f[nf] = sdup(ffblk.ff_name);
  558.                 done = findnext(&ffblk);
  559.                 }
  560. #else
  561.         done = DosFindFirst(    wild,
  562.                                 &hdir,
  563.                                 0,
  564.                                 &FFbufr,
  565.                                 sizeof(FFbufr),
  566.                                 &SearchCnt,
  567.                                 FIL_STANDARD);
  568.         for (nf=0;nf<70 && !done;nf++) {
  569.                 f[nf] = sdup(FFbufr.achName);
  570.                 done = DosFindNext( hdir,
  571.                                     &FFbufr,
  572.                                     sizeof(FFbufr),
  573.                                     &SearchCnt);
  574.                 }
  575. #endif
  576.  
  577. sortagain:;
  578.         swap = NULL;
  579.         for (i=0;i<(nf-1);i++) {
  580.                 if (strcmp(f[i],f[i+1])>0) {
  581.                         swap = f[i]; f[i] = f[i+1]; f[i+1] = swap;
  582.                 }
  583.         }
  584.         if (swap != NULL) goto sortagain;
  585.  
  586.         m = calloc(3+nf,sizeof(*m));
  587.         ask.menu = m;
  588.         ask.ci = 0;
  589.         if (nf==0) ask.ci = 1;
  590.         if (m==0) wprintf("memory allocation error");
  591.         for (mi=m,i=0;i<nf;i++,mi++) {
  592.                 setmenu(mi,x*20+1,y+5,MRETURN,0,18,"",f[i],"");
  593.                 x++;
  594.                 if (x==4) {x=0; y++; }
  595.         }
  596.         setmenu(mi,5,1,MNULL,0,0,"Use arrow keys to select file then press return","","");
  597.         mi++;
  598.         setmenu(mi,5,3,MRETURN,0,30,"Disk/Dir Specification ",wild,"");
  599.         mwild = mi;
  600.         mi++; mi->typ = 0;
  601.         rval = do_menu(&ask);
  602.         strcpy(result,((ask.menu)[ask.ci]).val);
  603.         for (i=0;i<nf;i++) myfree(f[i]);
  604.         myfree(m);
  605.  
  606.         if (strcmp(wild,mwild->val)!=0) {
  607.                 strcpy(wild,mwild->val);
  608.                 if (strstr(wild,"*")==NULL) {
  609.                         if (wild[strlen(wild)-1] == '\\')
  610.                                 strcat(wild,"*.dat");
  611.                         else
  612.                                 strcat(wild,"\\*.dat");
  613.                 }
  614.                 adddir = true;
  615.                 goto pick_again;
  616.         }
  617.  
  618.         if (adddir) {
  619.                 *(strfile(wild)) = 0;
  620. #if (defined __TURBOC__ || defined DJ)
  621.                 if (strstr(wild,":")!=NULL) {
  622.                         setdisk(toupper(*wild)-'A');
  623.                 }
  624.                 strcpy(buff2,wild+2); strcpy(wild,buff2);
  625. #endif
  626. #ifdef EMXOS2                                                   /* a.r. */
  627.                 if (strstr(wild,":")!=NULL) {
  628.                         DosSetDefaultDisk(toupper(*wild)-'A' + 1);
  629.                 }
  630.                 strcpy(buff2,wild+2); strcpy(wild,buff2);
  631.                 if (_chdir2(wild)!=0) ; /* {perror("Cannot change dir"); delay(3000);} */
  632. #else
  633.                 if (chdir(wild)!=0) ; /* {perror("Cannot change dir"); delay(3000);} */
  634. #endif
  635.         }
  636.  
  637. /*        if (adddir) {
  638.                 *(strfile(wild)+1) = 0;
  639.                 strcpy(result,wild);
  640.                 strcat(result,((ask.menu)[ask.ci]).val);
  641.         }
  642. */
  643.         return rval;
  644. }
  645. char *strfile(char *s)
  646. {
  647.         char *e;
  648.         e = s;
  649.         for (;*s!=0;s++) {
  650.                 if (*s==']'  ||  *s=='\\' || *s=='/' || *s==':') e = s;
  651.         }
  652.         return e;
  653. }
  654. char *tabtospace(char *s)
  655. {
  656.         static char buf[255];
  657.         char *o = &buf[0];
  658.         int p=0,k,df;
  659.         for (;*s!=0;s++) {
  660.                 if (*s==9) {
  661.                         df = (p/8)*8+8-p;
  662.                         for (k=1;k<=df;k++) {
  663.                                 *o++ = ' ';
  664.                                 p++;
  665.                         }
  666.                 } else {
  667.                         *o++ = *s;
  668.                         p++;
  669.                 }
  670.         }
  671.         *o = 0;
  672.         return &buf[0];
  673. }
  674.